'use strict';

class EsEnum {
  constructor(arr) {
    const typeArr = [];
    if (!Array.isArray(arr)) {
      throw 'arr is not an array!';
    }
    // eslint-disable-next-line array-callback-return
    arr.map(element => {
      if (!element.name || !element.code || !element.msg) {
        // eslint-disable-next-line array-callback-return
        return;
      }
      // 保存code值组成的数组，方便A.getName(name)类型的调用
      typeArr.push(element.name);
      // 根据code生成不同属性值，以便A.B.name类型的调用
      this[element.name] = element;
    });
    // 保存源数组
    this.arr = arr;
    this.typeArr = typeArr;
  }
  // 根据code得到对象
  valueOf(code) {
    return this.arr[this.typeArr.indexOf(code)];
  }
  // 根据code获取name值
  getNameByName(name) {
    const prop = this.valueOf(name);
    if (!prop) {
      throw 'No enum constant' + name;
    }
    return prop.msg;
  }

  // 返回源数组
  getValues() {
    return this.arr;
  }
}

module.exports = EsEnum;

